package am.dal;

import am.dal.entity.AccountBookDb;
import am.dal.entity.AccountItemDb;
import am.exception.ArgumentNullException;
import am.exception.InvalidOperationException;

public interface ItemDbOperator
{
    /**
     * 向数据库插入item表示的实体, 插入成功后分配给item一个Id
     * @param item 账目实体, 插入除Id外的所有属性, 插入成功后数据库自动产生一个Id, 分配给item
     * @throws ArgumentNullException item为null
     * @throws 一些数据库异常
     */
    void insertWithIdAssigned(AccountItemDb item) throws ArgumentNullException;

    /**
     * 更新数据库中与item对应的实体
     * @param item 账目实体, 与数据库中要更新的实体对应, 必须设置好Id
     * @throws ArgumentNullException item为null
     * @throws InvalidOperationException 数据库中不存在对应的实体
     * @throws 一些数据库异常
     */
    void update(AccountItemDb item) throws ArgumentNullException, InvalidOperationException;

    /**
     * 删除数据库中与items对应的所有实体
     * @param items 账目实体数组, 分别与数据库中要删除的实体对应, 必须一一设置好Id
     * @throws ArgumentNullException items为null
     * @throws InvalidOperationException 没想好
     * @throws 一些数据库异常
     */
    void delete(AccountItemDb[] items) throws ArgumentNullException, InvalidOperationException;

    /**
     * 从数据库中提取与item对应的实体并填充item
     * @param item 账目实体, 与数据库中的实体对应, 必须设置好Id
     * @throws ArgumentNullException item为null
     * @throws InvalidOperationException 数据库中不存在对应的实体
     * @throws 一些数据库异常
     */
    void fill(AccountItemDb item) throws ArgumentNullException, InvalidOperationException;

    /**
     * 从数据库中提取与book联系的所有账目实体
     * @param book 需要联系账本实体, 必须设置好Id
     * @return 所有与book联系的账目实体, 组成一个数组返回
     * @throws ArgumentNullException book为空
     * @throws InvalidOperationException 数据库中不存在对应的book实体
     * @throws 一些数据库异常
     */
    AccountItemDb[] selectByBookId(AccountBookDb book) throws ArgumentNullException, InvalidOperationException;
}
